package ar.com.larreta.colegio.entidades;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.hibernate.annotations.Where;

@Entity
@Table(name = "obligacion")
public class Obligacion extends Producto implements Comparable<Obligacion> {
	
	private Date vencimiento;
	private Set<Detalle> detalles;
	private Item item;
	
	@ManyToOne (fetch=FetchType.LAZY)
	@JoinColumn (name="idItem")
	public Item getItem() {
		return item;
	}

	public void setItem(Item item) {
		this.item = item;
	}

	@Transient
	public JRDataSource getDetallesDataSource(){
		List detalles = new ArrayList(getDetalles());
		Collections.sort(detalles);
		return new JRBeanCollectionDataSource(detalles);
	}
	
	@Transient
	public JRDataSource getDetalles2DataSource(){
		return getDetallesDataSource();
	}
	
	
	@OneToMany (mappedBy="obligacion", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
	// Solamente trae los que no fueron borrados logicamente
	@Where(clause="fechaEliminacion IS NULL")
	public Set<Detalle> getDetalles() {
		return detalles;
	}

	public void setDetalles(Set<Detalle> detalles) {
		if (detalles!=null){
			Date fechaActual = new Date();
			Iterator<Detalle> iterator = detalles.iterator();
			while (iterator.hasNext()) {
				Detalle detalle = (Detalle) iterator.next();
				detalle.setObligacion(this);
				detalle.setFechaCreacion(fechaActual);
			}
		}
		this.detalles = detalles;
	}

	@Basic @Column (name="vencimiento")
	public Date getVencimiento() {
		return vencimiento;
	}

	public void setVencimiento(Date vencimiento) {
		this.vencimiento = vencimiento;
	}	

	@Override
	public boolean equals(Object obj) {
		try{
			Obligacion entidad = (Obligacion) obj;
			return this.getId().equals(entidad.getId());
		} catch (Exception e){}
		return Boolean.FALSE;
	}
	
	@Transient
	public Double getValor() {
		Double valor = super.getValor();
		if ((detalles!=null) && (!detalles.isEmpty())){
			Double valorTmp = new Double(0);
			Iterator<Detalle> it = detalles.iterator();
			while (it.hasNext()) {
				Detalle detalles = (Detalle) it.next();
				if (detalles.getValor()!=null){
					valorTmp+=detalles.getValor();
				}
			}
			if ((valorTmp!=null) && (valorTmp>0)){
				valor = valorTmp;
			}			
		}
		return valor;
	}

	public int compareTo(Obligacion obligacion) {
		return this.getVencimiento().compareTo(obligacion.getVencimiento());
	}
	
}
